﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.OleDb;
using System.Data.SqlClient;
using System.Windows.Forms;

namespace SMS
{
    class  RowsCopiedEventArgs : EventArgs
    {
        public readonly long RowsCopied;
        public RowsCopiedEventArgs(long pRowsCopied)
        {
            RowsCopied = pRowsCopied;
        }
    }
    class ErrorEventArgs : EventArgs//ham moi them
    {
        public readonly string strMessage;
        public ErrorEventArgs(string pMessage)
        {
            strMessage=pMessage;
        }
    }
    class DBAccess
    {
        fLogin main;
        public DBAccess(fLogin main1)
        {
            main = main1;
        }
        long TotalRows = 0;
        public delegate void RowCopiedHanle(object obj, RowsCopiedEventArgs arg);
        
        public event RowCopiedHanle OnRowCopied;
        public delegate void ErrorHanle(object obj, ErrorEventArgs arg);
        public event ErrorHanle OnError;

        public DataTable ImportEmailList(string FileName, bool hasHeaders)
        {
            //Cho biết trong tập tin Excel có tiêu đề ở mỗi cột hay không
            string HDR = hasHeaders ? "Yes" : "No";
            //Chuỗi kết nối để mở và đọc dữ liệu từ tập tin EXCEL 2003 (yêu cầu máy cài Office 2003)
            //string strConn2 = String.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=\"Excel 8.0;HDR={1};IMEX=1\"", FileName, HDR);
            //Chuỗi kết nối để mở và đọc dữ liệu từ tập tin EXCEL 2007 (yêu cầu máy cài Office 2007 trở lên)
            string strConn = String.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=\"Excel 12.0;HDR={1};IMEX=1\"", FileName, HDR);

            //DataTable chứa kết quả đọc được
            DataTable outputTable = new DataTable("Email");

            using (OleDbConnection conn = new OleDbConnection(strConn))
            {
                conn.Open();

                //Lấy thông tin các sheet có trong tập tin EXCEL
                DataTable dt = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
                //Lấy tên Sheet đầu tiên
                string sheet = dt.Rows[0]["TABLE_NAME"].ToString();
                //Khai báo câu query để đọc nội dung của sheet đầu tiên 
                //(có thể đưa trực tiếp tên sheet vào đây,không cần bước lấy tên sheet ở trên
                OleDbCommand cmd = new OleDbCommand("SELECT * FROM [" + sheet + "]", conn);
                cmd.CommandType = CommandType.Text;

                SqlParameter p = new SqlParameter("Date", SqlDbType.DateTime);

                //Thực hiện đọc và lưu dữ liệu vào DataTable
                new OleDbDataAdapter(cmd).Fill(outputTable);
            }
            return outputTable;
        }

        public bool SaveEmailList(DataTable dtb)
        {
            if (dtb == null)
                return false;
            //Khai báo thông tin kết nối đến SQL Database
            //string strSqlConn = "Data source=B3M27\\SQLEXPRESS;Database=UserDB;User ID=sa;Password=123456";

            //KetNoiDataBase db = new KetNoiDataBase();
            SqlConnection con = main.KetNoiDB.GetConServer();

            //Khai báo đối tượng dùng kết nối CSDL
            //SqlConnection conn = new SqlConnection(strSqlConn);
            //Dùng xoá dữ liệu đang có trong bảng Email của SQL Database
            SqlCommand command = new SqlCommand();
            command.Connection = con;
            command.CommandText = "Truncate Table SINHVIEN";

            try
            {
                SqlBulkCopy bulk = new SqlBulkCopy(con);
                con.Open();
                command.ExecuteNonQuery();//thuc hien xoa du lieu dang co trong sql databases
                bulk.BatchSize = 500;// kich thuong moi khoi khi ghi vao sql database
                bulk.NotifyAfter = 1000;//thong bao sau moi 1000 dong dc ghi
                bulk.DestinationTableName = "SINHVIEN";//ten dang se ghi vao
                bulk.SqlRowsCopied += new SqlRowsCopiedEventHandler(bulk_SqlRowsCopied);
                                                   // dang ky ham se xu ly dc thong bao ve
                                                   // thuc hien ve ghi vao database
                bulk.ColumnMappings.Add("MASV", "MASV");
                bulk.ColumnMappings.Add("HO", "HO");
                bulk.ColumnMappings.Add("TEN", "TEN");
                bulk.ColumnMappings.Add("GIOITINH", "GIOITINH");
                bulk.ColumnMappings.Add("NGAYSINH", "NGAYSINH");
                bulk.ColumnMappings.Add("TENTINH", "TENTINH");
                bulk.ColumnMappings.Add("TENKHOA", "TENKHOA");
                bulk.ColumnMappings.Add("TENLOP", "TENLOP");
                bulk.WriteToServer(dtb);
                
                return true;
            }
            catch (Exception ex)
            {
                //viet day du
                ErrorEventArgs arg = new ErrorEventArgs(ex.Message);
                OnError(this, arg);
                //viet ngan gon
                //OnError(this, new ErrorEventArgs(ex.Message));
                return false;
            }
           
        }

        void bulk_SqlRowsCopied(object sender, SqlRowsCopiedEventArgs e)
        {
           // throw new NotImplementedException();
            OnRowCopied(this, new RowsCopiedEventArgs(e.RowsCopied));
        }

        public bool SaveEmailList1(DataTable dtb)
        {
            if (dtb == null)
                return false;
            foreach (DataRow dr in dtb.Rows)
            {
                InsertMail(dr);
            }
            return true;
        }

        public bool InsertMail(DataRow dr)
        {
            int count = 0;
            //Chuỗi chứa thông tin kết nối đến cơ sở dữ liệu
            //Khai báo đối tượng dùng kết nối CSDL
            //SqlConnection conn = new SqlConnection(strConn);
            ///KetNoiDataBase db = new KetNoiDataBase();
            SqlConnection con = main.KetNoiDB.GetConServer();
            //Khai báo đổi tượng để truy vấn dữ liệu
            SqlCommand command = new SqlCommand();
            command.Connection = con;

            SqlCommand command1 = new SqlCommand();
            command1.Connection = con;

            //command.CommandText = "INSERT INTO [QUANLYSINHVIEN_TEAM06].[dbo].[SINHVIEN](MASV,HO,TEN,GIOITINH,NGAYSINH,TENTINH,TENKHOA,TENLOP) "
            //    + " VALUES(@MASV,@HO,@TEN,@GIOITINH,@NGAYSINH,@TENTINH,@TENKHOA,@TENLOP)";

            command.CommandText = "INSERT INTO SINHVIEN(MASV,HO,TEN,GIOITINH,NGAYSINH,TENTINH,TENKHOA,TENLOP)"
                        + "VALUES(@MASV,@HO,@TEN,@GIOITINH,@NGAYSINH,@TENTINH,@TENKHOA,@TENLOP)";

            command1.CommandText = "INSERT INTO THONGTINCHITIETSINHVIEN (MASV)"
                        + "VALUES(@MASV)";
            //Cách thông thường
            //command.CommandText = "INSERT INTO Employees(FirstName,LastName,Title,TitleOfCourtesy,Birthdate,Hiredate,Address) "
            //+" VALUES('"+emp.FirstName+"','"+emp.LastName+"','"+emp.Title+"','"+emp.TitleOfCourtesy+"',"+
            //+emp.Birthday+","+emp.HireDay+",'"+emp.Address+"')";

            //Thêm các parameter
            //1. Cách đầy đủ
            //SqlParameter param1 = new SqlParameter("@FirstName", emp.FirstName);
            //command.Parameters.Add(param1);
            //2. Gộp 2 dòng lệnh trên vào 1 dòng lệnh

            command.Parameters.Add(new SqlParameter("@MASV", dr[0]));
            command1.Parameters.Add(new SqlParameter("@MASV", dr[0]));
            command.Parameters.Add(new SqlParameter("@HO", dr[1]));
            command.Parameters.Add(new SqlParameter("@TEN", dr[2]));
            command.Parameters.Add(new SqlParameter("@GIOITINH", dr[3]));
            command.Parameters.Add(new SqlParameter("@NGAYSINH", dr[4]));
            command.Parameters.Add(new SqlParameter("@TENTINH", dr[5]));
            command.Parameters.Add(new SqlParameter("@TENKHOA", dr[6]));
            command.Parameters.Add(new SqlParameter("@TENLOP", dr[7]));

            try
            {
                //Mở kết nối
                con.Open();
                //Thực thi việc thêm dữ liệu. kết quả trả về biến count là số dòng dữ liệu được thêm 
                // (trong trường hợp này, nếu thành công thì có 1 dòng dữ liệu được thêm vào Database)
                count = command.ExecuteNonQuery();
                count = command1.ExecuteNonQuery();
                //MessageBox.Show("import thành công");
                TotalRows++;
                if (TotalRows % 10 == 0)
                {
                    OnRowCopied(this, new RowsCopiedEventArgs(TotalRows));
                }
            }
            catch //(SqlException ex)
            {
                //MessageBox.Show("import lỗi");
            }
            finally
            {
                con.Close();
               
            }

            if (count == 1)
                return true;
            else
                return false;

        }
    }
}
